\begin{tikzpicture}

	\definecolor{defaultcolor}    {rgb}{1,1,1}
	\definecolor{drivercolor}     {rgb}{0.6,0.7,0.8}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1, minimum height=6ex, minimum width=16ex]

	\tikzstyle{service} = [draw=black, draw opacity=0.4, ball color=defaultcolor, fill opacity=0.2,
	                       rounded corners=0, shape=semicircle,
	                       inner sep=1.3ex, outer sep=0, above]

	\tikzstyle{drivernode} = [treenode, bottom color=drivercolor]

	\tikzstyle{infoflow} = [opacity=0.5,
	                        decoration={markings,
	                        mark=between positions 0.1 and 1 step 1ex with {\arrow{latex}}},
	                        postaction={decorate}]

	\tikzstyle{signalarrow}      = [arrow, densely dotted, sloped=false, thick]
	\tikzstyle{treesessionarrow} = [arrow, thick, sloped=false]
	\tikzstyle{smallabel}        = [scale=0.8]

	%
	% NIC
	%
	\node[drivernode] (nicserver) {NIC Server};
	\path (nicserver.north) node[service, scale=0.4] (nicservice) {};
	\path (nicserver.north) node[scale=0.7, yshift=-1.5ex] {NIC};

	\node[treenode, above=14ex of nicserver] (nicclient) {NIC Client};

	\path[treesessionarrow] (nicservice |- nicclient.south)
	   -- node[left, smallabel, align=right] {request\\ MAC and\\ link state} (nicservice);

	\path[infoflow] (nicserver.45)
		.. controls +(4ex,4ex) and +(4ex,-4ex) .. (nicclient.315);

	\path[infoflow] (nicclient.325)
		.. controls +(4ex,-4ex) and +(4ex,4ex) .. node[right, align=left] {payload} (nicserver.35);

	\path[signalarrow] (nicserver.145)
		.. controls +(-4ex,4ex) and +(-4ex,-4ex) .. node[left, align=right, smallabel] {link\\ state\\ changed} (nicclient.215);

	%
	% Uplink
	%
	\node[treenode, right=24ex of nicserver] (uplinkserver) {Uplink Server};
	\path (uplinkserver.north) node[service, scale=0.4] (uplinkservice) {};
	\path (uplinkserver.north) node[scale=0.7, yshift=-1.5ex] {Uplink};

	\path (uplinkserver.south) node[scale=0.7, yshift=2ex] {(NIC router)};

	\node[drivernode, above=14ex of uplinkserver] (uplinkclient) {Uplink Client};

	\tikzstyle{details} = [rectangle callout, draw opacity=0.3, fill=white, fill opacity=0.2,
	                       text opacity=1, rounded corners=3, draw]

	\tikzstyle{treesessionarrow} = [arrow, thick, opacity=0.5]
	\path[treesessionarrow] (uplinkservice |- uplinkclient.south)
	   -- node[details, sloped=false, smallabel, align=right, anchor=east,
	           callout relative pointer={(3ex,0ex)}, xshift=-3ex]
	           {session exists = link up\\ MAC as session argument} (uplinkservice);

	\path[infoflow] (uplinkserver.45)
		.. controls +(4ex,4ex) and +(4ex,-4ex) .. (uplinkclient.315);

	\path[infoflow] (uplinkclient.325)
		.. controls +(4ex,-4ex) and +(4ex,4ex) .. node[right, align=left] {payload} (uplinkserver.35);


\end{tikzpicture}
